#include "console.h"
#include <stdio.h>
#include <stdlib.h>
#include "arguments.h"
#include "string.h"
#include "fonctions.h"
#include <termios.h>

#include "cryptage.h"

static void c_aide() {

    printf("\
Utilisation : clyd [OPTION] [FILE]...\n\
Crypte ou decrypte les fichiers mis en entré selon un algorithme defini.\n\
\n\
  -c, --crypte\t\tcrypte tous les fichiers qui suivent l'option\n\
  -d, --decrypte\tdecrypte tous les fichiers qui suivent l'option\n\
  -a, --algorithme\tpermet de choisir l'algorithme pour crypter ou decrypter\n\
                  \tAlgorithme par defaut : DES\n\
  -h, --help\t\taffiche l'aide et quitte\n\n\
Les algorithmes disponibles sont : DES, 3DES et CESAR.\n");

    exit(0);
}

static unsigned char* c_lireMP() {
/** Précondition : aucune
  * Resultat : renvoie le mot de passe
  * Note : la saisie est sécurisé car les caractères ne s'affiche pas, même pas sous la forme d'étoile.
  */

    printf("Mot de passe : ");
    unsigned char *cr = NULL;
    size_t len;
    struct termios t;

    tcgetattr (0, &t);
    t.c_lflag &= !ECHO;
    tcsetattr(0, TCSANOW, &t);
    getline((char **)&cr, &len, stdin);
    cr[strlen((char *)cr)-1] = 0;
    tcgetattr(0, &t);
    t.c_lflag |= ECHO;
    tcsetattr (0, TCSANOW, &t);
    printf("\n");

    return cr;
}

void c_argAnalyse(int argc, char** argv) {

    if(argc == 1)
        c_aide(); // affichage de l'aide le programme prend fin

    TAB_arg t_a;

    initTabArg(&t_a);

    int i;
    int memo_option = 0; // O : fichier 1 : option cryptage 2: option decryptage et 3 :option algorithme

    if(strcmp(argv[1], "-c") != 0 && strcmp(argv[1], "--cryptage") != 0 && strcmp(argv[1], "-d") != 0 && strcmp(argv[1], "--decryptage") != 0 && strcmp(argv[1], "-a") != 0 && strcmp(argv[1], "--algorithme") != 0 && strcmp(argv[1], "-h") != 0 && strcmp(argv[1], "--help") != 0) {
        fprintf(stderr, "Vous n'avez pas saisie les arguments correctement.\n-h ou --help pour optenir de l'aide.\n");
        exit(0);
    }

    // On charge les arguments quelque soit l'ordre

    for(i = 1; i < argc; i++) {

        if(strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--cryptage") == 0) memo_option = 1;
        else if(strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "--decryptage") == 0) memo_option = 2;
        else if(strcmp(argv[i], "-a") == 0 || strcmp(argv[i], "--algorithme") == 0) memo_option = 3;
        else if(strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) c_aide();
        else if(memo_option == 1) ajoutArgC(&t_a, argv[i]);
        else if(memo_option == 2) ajoutArgD(&t_a, argv[i]);
        else if(memo_option == 3) ajoutArgA(&t_a, argv[i]);

    }

    if(t_a.algo == NULL) { // la verification n'est pas necessaire car elle est faite dans ajoutArgA()
        ajoutArgA(&t_a, "DES");
    }

    unsigned char *clef, *clef_verif;

    do { // On demande le mot de passe avec une vérification.

    printf("\n");
	clef = c_lireMP();

	printf("Verification du ");
	clef_verif = c_lireMP();

	} while(strcmp((char *)clef, (char*) clef_verif) != 0 );

    for(i = 0; i < t_a.taille_c; i++){ // Parcours des fichiers qui seront crypté et en fonction de l'algo choisis on crypte

        if(strcmp(t_a.algo, "DES") == 0) {

            printf("\nCrytptage DES de %s.\n", t_a.fichier_c[i]);
            cbc_des_c(t_a.fichier_c[i], clef);
            printf(" Fait\n");
        }
        else if(strcmp(t_a.algo, "3DES") == 0) {

            printf("\nCrytptage 3DES de %s.\nCela peut prendre du temps..\n", t_a.fichier_c[i]);
            cbc_troisdes_c(t_a.fichier_c[i], clef);
            printf(" fait\n");
        }
        else if(strcmp(t_a.algo, "CESAR") == 0) {

            printf("\nCryptage CESAR de %s.\n", t_a.fichier_c[i]);
            cesar_c(t_a.fichier_c[i], clef);
            printf(" fait\n");
        }
        else { // par defaut DES

            printf("\nCryptage DES de %s.\n", t_a.fichier_c[i]);
            cbc_des_c(t_a.fichier_c[i], clef);
            printf(" fait\n");
        }
    }

    for(i=0; i < t_a.taille_d; i++) { // Parcours des fichiers qui seront crypté et en fonction de l'algo choisis on decrypte

        if(strcmp(t_a.algo, "DES") == 0) {

            printf("\nDecryptage DES de %s.\n", t_a.fichier_d[i]);
            cbc_des_d(t_a.fichier_d[i], clef);
            printf(" fait\n");
            }
        else if(strcmp(t_a.algo, "3DES") == 0) {

            printf("\nDerytptage 3DES de %s.\nCela peut prendre du temps..\n", t_a.fichier_d[i]);
            cbc_troisdes_d(t_a.fichier_d[i], clef);
            printf(" fait\n");
        }
        else if(strcmp(t_a.algo, "CESAR") == 0) {

            printf("\nDecrytptage CESAR de %s.\n", t_a.fichier_d[i]);
            cesar_d(t_a.fichier_d[i], clef);
            printf(" fait\n");
        }
        else { // par default : DES

            printf("\nDecrytptage DES de %s.\n", t_a.fichier_d[i]);
            cbc_des_d(t_a.fichier_d[i], clef);
            printf(" fait\n");
        }
    }

    testamentTabArg(&t_a);

}
